/**
 * Created by Administrator on 2015/6/4.
 */
/*
*  1.前面提到的read、readfile、readsync、 write、writefile、writesync、删除文件
*  等都是先将文件完整的读到缓冲区，先得到他的size，并构建一个buffer，把数据读到buffer中。再从缓冲区中读取文件
*  把文件作为一个整体来执行，这样做的确定是：如果文件特别大，在内存中占用的空间就很多。容易引起内存溢出。在网络中不易传输。
*  效率低，资源浪费。
*  用read的时候，把文件作为一小块，把文件读入缓冲区。write的时候也是先写到缓冲区中，缓冲区满了，才将内容写到文件中。
*
*   readFile write把文件作为一个整体来执行，并且buffer的大小是固定的。
*   有时我们并不关心文件的具体内容，值关系是否
*   以及读到数据后该如何处理？这是可以用流实现。
*   在客户端 通过浏览器向服务器端提交请求，在服务器端可能是上传文件或提交表单。
*   服务器端并不知道传递过来多少内容。只能是发多少收多少，并到数据库或文件中。
*
*   流是一组有序的（而文件顺序不定），有起点和终点的字节传输数据手段。数据在网络上传输的时候最小单位是字节（一个字节是8位）。
*   因为传输是用的tcp协议，tcp协议是不关心编码和内容的。就是一个一个的接收字节。
*   但是当服务器接收到数据后需要处理，就要知道数据的格式，图片、MP3、文本编码。
*   在网络中传输数据，是以字节流的方式传输的。
* */
/*
* 流分为写入、读取两部分*
* path 文件路径
* options 选项
*  start 开始位置，从文件中开始的索引
*  end   结束位置，读到哪个索引结束
*  注意： 所有的索引是不包括结束位置的，唯独这里的end索引包括结束位置。
*  autoClose 是否自动关闭
* */
var fs=require('fs');
//var file=fs.createReadStream('./data.txt',{start:5,end:7,autoClose:true});//end 的索引包括结束位置
//获取到数据后如何处理
//当文件打开时会触发一个事件
/*file.on('open',function(){
    console.log('文件打开了！');
});*/
//读数据时触发的事件,打开文件后，读取文件就会发射data事件
//在回调函数中可以获取到数据
/*file.on('data',function(data){
    console.log('data'+data);
});

file.on('end',function(){
    console.log('读取完毕');
});

file.on('close',function(){
    console.log('文件关闭');
});

file.on('error',function(error){
    console.error('出错'+error);
})*/


//当数据库执行较慢时，暂停发射data事件。
//file.pause(); //暂停读取
//file.on('data',function(data){
//    console.log(data.toString());
//});
//setTimeout(function(){
//    file.resume();//5秒后恢复
//},5000)
var file=fs.createReadStream('./data.txt');//end 的索引包括结束位置
var arr=[];
file.on('readable',function(){//readable的触发时机，页面第一次加载进来和后面小桶的数据读完的时候。
    //监听readable事件后，相当于启用了暂停模式
    console.log('==========readable==========');
    var data;
    while(null!=(data=file.read(1))){
        //在小桶中一次读一个字节，并把数据读光
        arr.push(data);
    }
});
//在end的时候，将数据进行合并，因为每个都是buffer对象
file.on('end',function(){
    var b=Buffer.concat(arr);
    //console.log(b.toString());
});


/*流有两种模式：
    流动模式：监听data事件
    非流动模式：监听readable事件
*/









































































